﻿//========================================================= 
/**@file Base64CmdDriver.h
 * @brief Base64算法
 * 
 * @date 2017-05-12   21:12:59
 * @author Zhyioo 
 * @version 1.0
 */ 
//--------------------------------------------------------- 
#ifndef _LIBZHOUYB_BASE64CMDDRIVER_H_
#define _LIBZHOUYB_BASE64CMDDRIVER_H_
//--------------------------------------------------------- 
#include "../CommonCmdDriver.h"
#include "../../../extension/security/Base64_Provider.h"
using zhou_yb::extension::security::Base64_Provider;
//--------------------------------------------------------- 
namespace zhou_yb {
namespace application {
namespace driver {
//--------------------------------------------------------- 
class Base64CmdDriver : public CommonCmdDriver
{
protected:
    enum Base64Mode
    {
        StreamMode = 0,
        StringMode,
        FileMode
    };
    static Base64Mode ParseMode(IStringArguments& arg)
    {
        // 默认为Stream的形式
        Base64Mode mode = StreamMode;
        string sMode = arg["Mode"].To<string>("");
        if(StringConvert::Compare(sMode.c_str(), "Stream", true))
        {
            mode = StreamMode;
        }
        else if(StringConvert::Compare(sMode.c_str(), "String", true))
        {
            mode = StringMode;
        }
        else if(StringConvert::Compare(sMode.c_str(), "File", true))
        {
            mode = FileMode;
        }
        return mode;
    }
public:
    Base64CmdDriver() : CommonCmdDriver()
    {
        _RegisteCMD(Base64CmdDriver, Encode);
        _RegisteCMD(Base64CmdDriver, Decode);
    }
    /**
     * @brief 加密数据为base64格式
     * @date 2017-05-17 10:22
     * 
     * @param [in] Mode : string 需要计算的模式
     * - 模式:
     *  - File : 文件
     *  - Stream : 16进制格式字符串的字节流
     *  - String : 字符串
     * .
     * @param [in] DATA : hex 需要转为base64格式的数据
     * 
     * @return BASE64 : string 计算后的Base64字符串
     */
    LC_CMD_METHOD(Encode)
    {
        string sData;
        if(!arg.Get("DATA", sData))
        {
            _logErr(DeviceError::ArgIsNullErr, "参数DATA不存在");
            return false;
        }
        Base64Mode mode = ParseMode(arg);
        ByteBuilder data(32);
        ByteBuilder base64(32);
        switch(mode)
        {
        case StreamMode:
            DevCommand::FromAscii(sData.c_str(), data);
            Base64_Provider::Encode(data, base64);
            break;
        case StringMode:
            Base64_Provider::Encode(sData.c_str(), base64);
            break;
        case FileMode:
            Base64_Provider::EncodeFile(sData.c_str(), base64);
            break;
        }
        rlt.Put("BASE64", base64.GetString());
        return true;
    }
    /**
     * @brief 解密base64格式数据
     * @date 2017-05-17 10:25
     * 
     * @param [in] BASE64 : string 需要解密的base64格式数据
     * @param [in] Mode : string 需要计算的模式
     * - 模式:
     *  - File : 文件
     *  - Stream : 16进制格式字符串的字节流
     *  - String : 字符串
     * .
     * 
     * @retval DATA : string 解密后的数据
     */
    LC_CMD_METHOD(Decode)
    {
        string sBase64;
        if(!arg.Get("BASE64", sBase64))
        {
            _logErr(DeviceError::ArgIsNullErr, "参数BASE64不存在");
            return false;
        }
        Base64Mode mode = ParseMode(arg);
        ByteBuilder data(32);
        ByteBuilder buff(32);

        ByteArray base64(sBase64.c_str(), sBase64.length());
        switch(mode)
        {
        case StreamMode:
            Base64_Provider::Decode(base64, buff);
            ByteConvert::ToAscii(buff, data);
            break;
        case StringMode:
            Base64_Provider::Decode(base64, data);
            break;
        case FileMode:
            break;
        }
        rlt.Put("DATA", data.GetString());
        return true;
    }
};
//--------------------------------------------------------- 
} // nemespace driver
} // namespace application
} // namespace zhou_yb
//--------------------------------------------------------- 
#endif // _LIBZHOUYB_BASE64CMDDRIVER_H_
//========================================================= 